//
//  main.c
//  位运算
//
//  Created by ws on 2017/7/19.
//  Copyright © 2017年 王松. All rights reserved.
//

#include <stdio.h>

/**
 位运算:针对二进制位的运算
 & 按位与:对应的二进制位上,有假则假,只要有一个为0都是0,全部为1才是1,一假则假
 | 按位或:对应的二进制位上,有真则真,一真则真
 ^ 按位异或":对应的二进制位上,不同为1 相同为0 ,
           1.多个数相互异或 交换顺序 结果不变(类似加法交换律)
           2.任何数异或上0都是原来的数
           3.相同的数相互异或 结果是0
 ~ 按位取反:对应的二进制位上,0变1,1变0
 
 >> 右移 :a >> n:吧表示a向右移n位,移出来的位就删掉,移入的位补符号位(正数补0,负数补1)
         使用场景:快速计算一个数除以2的n次方,对于一个整数来说你右移几位就是除以2的几次方
 
 << 左移 :a >> n:吧表示a向左移n位,移出来的位就删掉,移入的位补0
        注意点:左移可能会改变符号位
        使用场景:当一个数比较小的时候,可以快速计算一个乘以2的几次方
 
 */


/**
 & 按位与 一假则假
  1101
 &1001
-------
  1001
 */
void test(){
    int a = 13;
    int b = 9;
    int rs = a & b;
    printf("%d\n",rs);
}

/**
 | 按位或 一真则真
 1101
|1001
 -------
 1101
 */
void test1(){
    int a = 13;
    int b = 9;
    int rs = a | b;
    printf("%d\n",rs);
}
/**
 ^ 按位异或:对应的二进制位上,不同为1 相同为0 
   1.多个数相互异或 交换顺序 结果不变(类似加法交换律)
   2.任何数异或上0都是原来的数
   3.相同的数相互异或 结果是0
 1101
^1001
 -------
 0100
 
 */
void test2(){
    int a = 13;
    int b = 9;
    int c = 10;
    int rs = a ^ b ^ c;
    printf("%d\n",rs);
}
/**
  ~ 按位取反:对应的二进制位上,0变1,1变0
 
 */

void test3(){
    int c = 10;
    int rs = ~c;
    printf("%d\n",rs); //-11
}

/**
  >> 右移   a >> n:吧表示a向右移n位,移出来的位就删掉,移入的位补符号位(正数补0,负数补1)
  使用场景:快速计算一个数除以2的n次方,对于一个整数来说你右移几位就是除以2的几次方
 
 
 */
void test4(){
    int a = 10;
    int res =  a >> 2;//表示a右移2位
    //  0000 0000 0000 0000 0000 0000 0000 1010
    //  a右移2位
    //  000000 0000 0000 0000 0000 0000 0000 10
    //
    printf("%d\n",res); // 2
}
/**
 << 左移   a << n:吧表示a向左移n位,移出来的位就删掉,移入的位补0 (可能改变符号位)
 使用场景:当一个数比较小的时候,可以快速计算一个乘以2的几次方
 
 */
void test5(){
    int a = 10;
    int res =  a << 2;//表示a左移2位
    //  0000 0000 0000 0000 0000 0000 0000 1010
    //  a左移2位
    //  00 0000 0000 0000 0000 0000 0000 101000
    //
    printf("%d\n",res); // 40

}


int main(int argc, const char * argv[]) {
    int a = 10;
    int res =  a << 2;//表示a左移2位
    //  0000 0000 0000 0000 0000 0000 0000 1010
    //  a左移2位
    //  00 0000 0000 0000 0000 0000 0000 101000
    //
    printf("%d\n",res); // 40

    return 0;
}
